import diff from "./diff";
import mountElement from "./mountElement";

export function updateComponent(vDom, oldComponent, oldDom, container) {
  // 组件更新
  // 调用 生命周期 
  oldComponent.componentWillReceiveProps(vDom.props);

  // 判断组件是否需要更新
  if (oldComponent.shouldComponentUpdate(vDom.props)) {
    // 未更新前的props
    let prevProps = oldComponent.props;
    oldComponent.componentWillUpdate(vDom.props);
    // 通过调用 oldComponent.updateProps 更新props
    oldComponent.updateProps(vDom.props);
    // 获取最新的Vdom
    let nextVDom = oldComponent.render();
    // 更新 component 组件实例对象
    nextVDom.component = oldComponent;
    // 对比差异 更新视图
    diff(nextVDom, container, oldDom);
    // 生命周期
    oldComponent.componentDidUpdate(prevProps);
  }
}

// 判断是否是同一个组件
export function isSameComponent(vDom, oldComponent) {
  return oldComponent && vDom.type === oldComponent.constructor;
}

export default function diffComponent(vDom, oldComponent, oldDom, container) {
  // 判断当前渲染的vDom和oldComponent是否是同一个组件，如果是组件更新，替换旧的Dom对象
  if (isSameComponent(vDom, oldComponent)) {
    // 是同一个组件 做组件更新
    updateComponent(vDom, oldComponent, oldDom, container);
  } else {
    // 不是同一个组件
    mountElement(vDom, container, oldDom);
  }
}